package xin.marcher.wind.process.processor;

/**
 * 抽象流程，提供了流程包装功能
 *
 * template method 设计模式运用在里面
 * 通过定义了一个 process 方法，定义了各个子方法的运行流程和顺序
 * 各个子方法都提供了一个空实现，但是具体的实现都交给子类覆盖实现
 * 对于子类来说的话，只要把需要执行的子方法实现，具体的方法运行顺序和调用熟悉，都交给抽象父类就可以了
 *
 * @author marcher
 */
public abstract class AbstractProcessor implements Processor {

    private String name;

    @Override
    public void process(ProcessContext context) {
        beforeProcess(context);
        processInternal(context);
        afterProcess(context);
    }

    /**
     * 流程核心逻辑
     *
     * @param context 上下文
     */
    protected abstract void processInternal(ProcessContext context);

    /**
     * 流程前操作
     *
     * @param context 上下文
     */
    protected void beforeProcess(ProcessContext context) {
        // default no-op
    }

    /**
     * 流程后的操作
     *
     * @param context 上下文
     */
    protected void afterProcess(ProcessContext context) {
        // default no-op
    }

    @Override
    public void caughtException(ProcessContext context, Throwable throwable) {
        // default no-op
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

}
